<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>INSERT</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="REFENTRY">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="sql-grant.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="sql-grant.html">快退</a></td><td width="60%" align="center" valign="bottom"></td><td width="10%" align="right" valign="top"><a href="sql-listen.html">快进</a></td><td width="10%" align="right" valign="top"><a href="sql-listen.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<h1><a name="SQL-INSERT"></a>INSERT</h1>
<div class="REFNAMEDIV"><a name="AEN52298"></a><h2>名称</h2>INSERT&nbsp;--&nbsp;在表中创建新行</div>
<a name="AEN52301"></a>
<div class="REFSYNOPSISDIV"><a name="AEN52303"></a><h2>语法</h2>
<pre class="SYNOPSIS">INSERT INTO <tt class="REPLACEABLE"><i>table</i></tt> [ ( <tt class="REPLACEABLE"><i>column</i></tt> [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { <tt class="REPLACEABLE"><i>expression</i></tt> | DEFAULT } [, ...] ) [, ...] | <tt class="REPLACEABLE"><i>query</i></tt> }
    [ RETURNING * | <tt class="REPLACEABLE"><i>output_expression</i></tt> [ AS <tt class="REPLACEABLE"><i>output_name</i></tt> ] [, ...] ]</pre>
</div>
<div class="REFSECT1"><a name="AEN52311"></a><h2>描述</h2>
<p><tt class="COMMAND">INSERT</tt> 向表中插入新行。可以一次插入用值表达式声明的一行或者一个查询结果表现出来的零行或多个行。</p>
<p>目标列表中的列/字段可以按任何顺序排列。如果完全没有列出任何字段名，那么缺省是全部字段，顺序是按照表声明的时候的顺序；如果 <tt class="LITERAL">VALUES</tt> 子句或者 <tt class="REPLACEABLE"><i>query</i></tt> 里面只提供了 <tt class="REPLACEABLE"><i>N</i></tt> 个字段，那么就是头 <tt class="REPLACEABLE"><i>N</i></tt> 个字段。<tt class="LITERAL">VALUES</tt> 子句或者 <tt class="REPLACEABLE"><i>query</i></tt> 提供的数值是以从左到右的方式与明确或者隐含的字段列表关联的。</p>
<p>每个没有在明确或者隐含的字段列表中出现的字段都将填充缺省值，如果有声明的缺省值则用声明的那个，如果没有则用 NULL 。</p>
<p>如果每行的表达式不是正确的数据类型，系统将试图进行自动的类型转换。</p>
<p>可选的 <tt class="LITERAL">RETURNING</tt> 子句将导致 <tt class="COMMAND">INSERT</tt> 返回实际插入的行，它主要用于获取缺省的计算值(比如序列值)，不过，任何使用该表字段的表达式都是允许的。<tt class="LITERAL">RETURNING</tt> 列表的语法都与 <tt class="COMMAND">SELECT</tt> 的输出列表相同。</p>
<p>要想向表中插入数据，你必须有 <tt class="LITERAL">INSERT</tt> 权限；要使用 <tt class="LITERAL">RETURNING</tt> 的话还得有 <tt class="LITERAL">SELECT</tt> 权限；如果你使用了 <tt class="REPLACEABLE"><i>query</i></tt> 子句插入来自查询里的数据行，你还需要拥有在查询里使用的表的 <tt class="LITERAL">SELECT</tt> 权限。</p>
</div>
<div class="REFSECT1"><a name="AEN52335"></a><h2>参数</h2>
<div class="VARIABLELIST">
<dl>
<dt><tt class="REPLACEABLE"><i>table</i></tt></dt>
<dd><p>现存表的名称(可以有模式修饰)</p></dd>
<dt><tt class="REPLACEABLE"><i>column</i></tt></dt>
<dd><p>表 <tt class="REPLACEABLE"><i>table</i></tt> 中的字段名。必要时，字段名可以有子字段名或者数组下标修饰。向一个复合类型中的某些字段插入数据的话，其它字段将是 NULL 。</p></dd>
<dt><tt class="LITERAL">DEFAULT VALUES</tt></dt>
<dd><p>所有字段都会用它们的缺省值填充</p></dd>
<dt><tt class="REPLACEABLE"><i>expression</i></tt></dt>
<dd><p>赋予对应的 <tt class="REPLACEABLE"><i>column</i></tt> 的一个有效表达式或值</p></dd>
<dt><tt class="LITERAL">DEFAULT</tt></dt>
<dd><p>对应的 <tt class="REPLACEABLE"><i>column</i></tt> 将被它的缺省值填充</p></dd>
<dt><tt class="REPLACEABLE"><i>query</i></tt></dt>
<dd><p>一个查询(<tt class="COMMAND">SELECT</tt> 语句)，它提供插入的数据行。请参考 <a href="sql-select.html"><i>SELECT</i></a> 语句获取语法描述。</p></dd>
<dt><tt class="REPLACEABLE"><i>output_expression</i></tt></dt>
<dd><p><tt class="COMMAND">INSERT</tt> 命令在每一行都被插入之后用于计算输出结果的表达式。该表达式可以使用 <tt class="REPLACEABLE"><i>table</i></tt> 的任意字段。可以使用 <tt class="LITERAL">*</tt> 返回被插入行的所有字段。</p></dd>
<dt><tt class="REPLACEABLE"><i>output_name</i></tt></dt>
<dd><p>一个字段的输出名称</p></dd>
</dl>
</div>
</div>
<div class="REFSECT1"><a name="AEN52386"></a><h2>输出</h2>
<p>成功完成后，一条 <tt class="COMMAND">INSERT</tt> 命令返回一个下面形式的命令标签</p>
<pre class="SCREEN">INSERT <tt class="REPLACEABLE"><i>oid</i></tt> <tt class="REPLACEABLE"><i>count</i></tt></pre>
<p><tt class="REPLACEABLE"><i>count</i></tt> 是插入的行数。如果 <tt class="REPLACEABLE"><i>count</i></tt> 正好是一，并且目标表有 OID ，那么 <tt class="REPLACEABLE"><i>oid</i></tt> 是赋予插入行的 OID 。否则 <tt class="REPLACEABLE"><i>oid</i></tt> 是零。</p>
<p>如果 <tt class="COMMAND">INSERT</tt> 命令包含 <tt class="LITERAL">RETURNING</tt> 子句，其结果将和一个 <tt class="COMMAND">SELECT</tt> 语句相同，包含那些基于该命令实际插入的行计算的、定义在 <tt class="LITERAL">RETURNING</tt> 列表中的字段的值。</p>
</div>
<div class="REFSECT1"><a name="AEN52403"></a><h2>例子</h2>
<p>向表 <tt class="LITERAL">films</tt> 里插入单独一行：</p>
<pre class="PROGRAMLISTING">INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, '1971-07-13', 'Comedy', '82 minutes');</pre>
<p>在这个例子里面省略了字段 <tt class="LITERAL">len</tt> ，因此在它里面将存储缺省值：</p>
<pre class="PROGRAMLISTING">INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');</pre>
<p>在这个例子里，用 <tt class="LITERAL">DEFAULT</tt> 子句作为日期字段，而不是声明一个数值：</p>
<pre class="PROGRAMLISTING">INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes');
INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama');</pre>
<p>插入一行完全由缺省值组成的数据行：</p>
<pre class="PROGRAMLISTING">INSERT INTO films DEFAULT VALUES;</pre>
<p>使用多行 <tt class="COMMAND">VALUES</tt> 语法插入多行：</p>
<pre class="PROGRAMLISTING">INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');</pre>
<p>从表 <tt class="LITERAL">tmp_films</tt> 中插入几行到表 <tt class="LITERAL">films</tt> 中，字段布局与 <tt class="LITERAL">films</tt> 相同：</p>
<pre class="PROGRAMLISTING">INSERT INTO films SELECT * FROM tmp_films WHERE date_prod &lt; '2004-05-07';</pre>
<p>插入数组：</p>
<pre class="PROGRAMLISTING">-- 创建一个空的3x3游戏板来玩圈-和-叉游戏(这些查询创建相同的板属性)
INSERT INTO tictactoe (game, board[1:3][1:3])
    VALUES (1, '{{" "," "," "},{" "," "," "},{" "," "," "}}');
-- 上述例子中的下标并非真正必须
INSERT INTO tictactoe (game, board)
    VALUES (2, '{{X," "," "},{" ",O," "},{" ",X," "}}');</pre>
<p>向 <tt class="LITERAL">distributors</tt> 表插入一个单独的行，并返回由 <tt class="LITERAL">DEFAULT</tt> 子句生成的序列值：</p>
<pre class="PROGRAMLISTING">INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;</pre>
</div>
<div class="REFSECT1"><a name="AEN52430"></a><h2>兼容性</h2>
<p><tt class="COMMAND">INSERT</tt> 语句与 SQL 标准兼容。但 <tt class="LITERAL">RETURNING</tt> 子句是 PostgreSQL 扩展。同样，省略字段名列表，但是并非所有字段都从 <tt class="LITERAL">VALUES</tt> 子句或者 <tt class="REPLACEABLE"><i>query</i></tt> 填充的这种用法是标准不允许的。</p>
<p>可能碰到的关于 <tt class="REPLACEABLE"><i>query</i></tt> 子句特性的限制在 <a href="sql-select.html"><i>SELECT</i></a> 语句中有相关文档。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="sql-grant.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="sql-listen.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">GRANT</td><td width="34%" align="center" valign="top"><a href="sql-commands.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">LISTEN</td></tr>
</table>
</div>
</body></html>